{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Add Network Perturbations to Network\n",
    "This notebook serves to add random perturbations to the original network. This is done by first removing a certain percentage of random edges from the network and then adding the same number of edges somewhere randomly in the graph."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/sasse/.local/lib/python3.6/site-packages/h5py/__init__.py:34: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n",
      "  from ._conv import register_converters as _register_converters\n"
     ]
    }
   ],
   "source": [
    "import networkx as nx\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import h5py\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "data_file = '../data/pancancer/hotnet_iref_heat_input_unbalanced.h5'\n",
    "\n",
    "with h5py.File(data_file, 'r') as f:\n",
    "    network = f['network'][:]\n",
    "    features = f['features'][:]\n",
    "    node_names = f['gene_names'][:]\n",
    "    y_train = f['y_train'][:]\n",
    "    y_test = f['y_test'][:]\n",
    "    if 'y_val' in f:\n",
    "        y_val = f['y_val'][:]\n",
    "    else:\n",
    "        y_val = None\n",
    "    train_mask = f['mask_train'][:]\n",
    "    test_mask = f['mask_test'][:]\n",
    "    if 'mask_val' in f:\n",
    "        val_mask = f['mask_val'][:]\n",
    "    else:\n",
    "        val_mask = None"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. Network perturbations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def perturb_network(A, proportion_to_change):\n",
    "    # calculate proportions\n",
    "    to_keep = int(round(A.sum() * (1 - proportion_to_change)))\n",
    "    to_add = int(round(A.sum() * proportion_to_change))\n",
    "\n",
    "    # remove edges by building new graph with less edges\n",
    "    row_idx, col_idx = np.where(A == 1) # all edge indices\n",
    "    edges_to_keep = np.random.choice(np.indices(row_idx.shape)[0],\n",
    "                                     size=to_keep,\n",
    "                                     replace=False)\n",
    "    A_perturbed = np.zeros_like(A)\n",
    "    A_perturbed[row_idx[edges_to_keep], col_idx[edges_to_keep]] = 1\n",
    "    \n",
    "    # now, randomly add edges\n",
    "    row_idx, col_idx = np.where(A_perturbed == 0) # possible edges to add\n",
    "    edges_to_add = np.random.choice(np.indices(row_idx.shape)[0],\n",
    "                                    size=to_add,\n",
    "                                    replace=False)\n",
    "    A_perturbed[row_idx[edges_to_add], col_idx[edges_to_add]] = 1\n",
    "    \n",
    "    return A_perturbed"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "ppi_little_perturbed = perturb_network(network, .15)\n",
    "ppi_medium_perturbed = perturb_network(network, .30)\n",
    "ppi_largely_perturbed = perturb_network(network, .60)\n",
    "ppi_extremely_perturbed = perturb_network(network, .85)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nou42AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f85961e8b70>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot node degree to check if distribution follows power law\n",
    "fig = plt.figure(figsize=(14, 8))\n",
    "bins = np.linspace(1, 100, 100)\n",
    "\n",
    "plt.subplot(2, 3, 1)\n",
    "ax = plt.hist(network.sum(axis=0), bins)\n",
    "#plt.xlabel('Node Degree')\n",
    "plt.ylabel('Number of genes with node degree')\n",
    "plt.title('Node Degree Distribution Original')\n",
    "\n",
    "plt.subplot(2, 3, 2)\n",
    "ax = plt.hist(ppi_little_perturbed.sum(axis=0), bins)\n",
    "#plt.xlabel('Node Degree')\n",
    "#plt.ylabel('Number of genes with node degree')\n",
    "plt.title('Node Degree Distribution Little Perturbed (15%)')\n",
    "              \n",
    "plt.subplot(2, 3, 3)\n",
    "ax = plt.hist(ppi_medium_perturbed.sum(axis=0), bins)\n",
    "plt.xlabel('Node Degree')\n",
    "#plt.ylabel('Number of genes with node degree')\n",
    "plt.title('Node Degree Distribution Medium Perturbed (30%)')\n",
    "\n",
    "plt.subplot(2, 3, 4)\n",
    "ax = plt.hist(ppi_largely_perturbed.sum(axis=0), bins)\n",
    "plt.xlabel('Node Degree')\n",
    "plt.ylabel('Number of genes with node degree')\n",
    "plt.title('Node Degree Distribution Heavily Perturbed (60%)')\n",
    "\n",
    "plt.subplot(2, 3, 5)\n",
    "ax = plt.hist(ppi_extremely_perturbed.sum(axis=0), bins)\n",
    "plt.xlabel('Node Degree')\n",
    "#plt.ylabel('Number of genes with node degree')\n",
    "plt.title('Node Degree Distribution Extremely Perturbed (85%)')\n",
    "\n",
    "fig.savefig('network_node_degrees.png')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Save back to HDF5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "ppi_network = nx.to_numpy_array(G)\n",
    "# test if ppi_network (A) has the same degree as the graph\n",
    "# this should test if the features have the same ordering as the network\n",
    "assert (np.all(np.equal(ppi_network.sum(axis=0), np.array([d[1] for d in list(nx.degree(G))]))))\n",
    "\n",
    "# only one dim output (not one-hot)\n",
    "#y_train = np.array([y_train[:, 0]]).T\n",
    "#y_test = np.array([y_test[:, 0]]).T\n",
    "#if X_val is not None:\n",
    "#    y_val = np.array([y_val[:, 0]]).T\n",
    "\n",
    "# build feature vector\n",
    "node_index = nx.to_pandas_adjacency(G).index\n",
    "if USE_HEAT_SCORES:\n",
    "    attributes = nx.get_node_attributes(G, 'heat')\n",
    "    features = np.array([[attributes[i] for i in node_index]]).T\n",
    "else:\n",
    "    attributes = nx.get_node_attributes(G, 'features')\n",
    "    features = np.array([attributes[i] for i in node_index])\n",
    "\n",
    "# create gene names\n",
    "string_dt = h5py.special_dtype(vlen=str)\n",
    "\n",
    "# determine file name by parameters\n",
    "b = 'balanced' if BALANCE else 'unbalanced'\n",
    "f = 'heat' if USE_HEAT_SCORES else 'vec'\n",
    "fname = '../data/pancancer/hotnet_iref_{}_input_{}.h5'.format(f, b)\n",
    "f = h5py.File(fname, 'w')\n",
    "\n",
    "# add ppi network\n",
    "f.create_dataset('network', data=ppi_network, shape=ppi_network.shape)\n",
    "f.create_dataset('network_little_perturbed', data=ppi_little_perturbed, shape=ppi_little_perturbed.shape)\n",
    "f.create_dataset('network_medium_perturbed', data=ppi_medium_perturbed, shape=ppi_medium_perturbed.shape)\n",
    "f.create_dataset('network_largely_perturbed', data=ppi_largely_perturbed, shape=ppi_largely_perturbed.shape)\n",
    "\n",
    "# add features\n",
    "f.create_dataset('features', data=features, shape=features.shape)\n",
    "# add gene names (same order as features & network)\n",
    "f.create_dataset('gene_names', data=gene_names, dtype=string_dt)\n",
    "# add labels\n",
    "f.create_dataset('y_train', data=y_train, shape=y_train.shape)\n",
    "f.create_dataset('y_test', data=y_test, shape=y_test.shape)\n",
    "if X_val is not None:\n",
    "    f.create_dataset('y_val', data=y_val, shape=y_val.shape)\n",
    "\n",
    "f.create_dataset('mask_train', data=train_mask, shape=train_mask.shape)\n",
    "f.create_dataset('mask_test', data=test_mask, shape=test_mask.shape)\n",
    "if X_val is not None:\n",
    "    f.create_dataset('mask_val', data=val_mask, shape=val_mask.shape)\n",
    "f.close()\n",
    "print (\"Container written to {}\".format(fname))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
